package Demo12;

import java.util.Arrays;

/**
 * 将x减到0的最小操作数
 * https://leetcode.cn/problems/minimum-operations-to-reduce-x-to-zero/
 * 总结, 我们直接找 范围等于x 的区域, 会出现是左边, 右边 和中间的情况
 * 那我们就可以逆向思维, 找到数组中最长的子数组, 和位 数组长度减 x
 * 然后返回 数组长度减去 和的长度的值就是最后的结果了
 */

class Solution {
    public int minOperations(int[] nums, int x) {
        int sum = 0,ret = -1;
        for(int n : nums) sum += n;// 统计数组的和
        int target = sum - x;
        if(target < 0) return ret;
        // tmp == 滑动窗口内的和
        for(int left = 0,right = 0,tmp = 0;right < nums.length;right++) {
            tmp += nums[right];
            while(tmp > target) tmp -= nums[left++];
            if(tmp == target) {
                ret = Math.max(ret,right - left + 1);
            }
        }
        if(ret == -1) {
            return ret;
        }
        return nums.length - ret;
    }
}
class Demo12 {
    public static void main(String[] args) {
        Solution solution = new Solution();
        int ret = solution.minOperations(new int[] {1,1,4,2,3},5);
        System.out.println(ret);
    }
}